﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TagBasedResourceManagePlatform.Misc
{
    public class MineTypeHelper
    {
        public struct MineType
        {
            public string MajorType { get; set; }
            public string MinorType { get; set; }

            public MineType(string mineTypeString)
            {
                string[] _params = mineTypeString.ToLower().Split('/');
                if (_params.Length != 2)
                    throw new ArgumentException("Unexcepted minetype.", "mineTypeString");

                MajorType = _params[0];
                MinorType = _params[1];
            }
        }

        private static Dictionary<string, string> _mineTypesDic = new Dictionary<string, string>()
        {
            {".3dm","x-world/x-3dmf"},
            {".3dmf","x-world/x-3dmf"},
            {".a","application/octet-stream"},
            {".aab","application/x-authorware-bin"},
            {".aam","application/x-authorware-map"},
            {".aas","application/x-authorware-seg"},
            {".abc","text/vnd.abc"},
            {".acgi","text/html"},
            {".afl","video/animaflex"},
            {".ai","application/postscript"},
            {".aif","audio/aiff"},
            {".aifc","audio/aiff"},
            {".aiff","audio/aiff"},
            {".aim","application/x-aim"},
            {".aip","text/x-audiosoft-intra"},
            {".ani","application/x-navi-animation"},
            {".aos","application/x-nokia-9000-communicator-add-on-software"},
            {".aps","application/mime"},
            {".arc","application/octet-stream"},
            {".arj","application/arj"},
            {".art","image/x-jg"},
            {".asf","video/x-ms-asf"},
            {".asm","text/x-asm"},
            {".asp","text/asp"},
            {".asx","video/x-ms-asf"},
            {".au","audio/x-au"},
            {".avi","video/avi"},
            {".avs","video/avs-video"},
            {".bcpio","application/x-bcpio"},
            {".bin","application/octet-stream"},
            {".bm","image/bmp"},
            {".bmp","image/bmp"},
            {".boo","application/book"},
            {".book","application/book"},
            {".boz","application/x-bzip2"},
            {".bsh","application/x-bsh"},
            {".bz","application/x-bzip"},
            {".bz2","application/x-bzip2"},
            {".c","text/plain"},
            {".c++","text/plain"},
            {".cat","application/vnd.ms-pki.seccat"},
            {".cc","text/plain"},
            {".ccad","application/clariscad"},
            {".cco","application/x-cocoa"},
            {".cdf","application/cdf"},
            {".cer","application/pkix-cert"},
            {".cha","application/x-chat"},
            {".chat","application/x-chat"},
            {".class","application/java"},
            {".com","application/octet-stream"},
            {".conf","text/plain"},
            {".cpio","application/x-cpio"},
            {".cpp","text/x-c"},
            {".cpt","application/x-compactpro"},
            {".crl","application/pkcs-crl"},
            {".crt","application/x-x509-ca-cert"},
            {".csh","application/x-csh"},
            {".css","text/css"},
            {".cxx","text/plain"},
            {".dcr","application/x-director"},
            {".deepv","application/x-deepv"},
            {".def","text/plain"},
            {".der","application/x-x509-ca-cert"},
            {".dif","video/x-dv"},
            {".dir","application/x-director"},
            {".dl","video/dl"},
            {".doc","application/msword"},
            {".docx","application/msword"},
            {".dot","application/msword"},
            {".dp","application/commonground"},
            {".drw","application/drafting"},
            {".dump","application/octet-stream"},
            {".dv","video/x-dv"},
            {".dvi","application/x-dvi"},
            {".dwf","model/vnd.dwf"},
            {".dwg","image/x-dwg"},
            {".dxf","image/x-dwg"},
            {".dxr","application/x-director"},
            {".el","text/x-script.elisp"},
            {".elc","application/x-elc"},
            {".env","application/x-envoy"},
            {".eps","application/postscript"},
            {".es","application/x-esrehber"},
            {".etx","text/x-setext"},
            {".evy","application/x-envoy"},
            {".exe","application/octet-stream"},
            {".f","text/x-fortran"},
            {".f77","text/x-fortran"},
            {".f90","text/x-fortran"},
            {".fdf","application/vnd.fdf"},
            {".fif","image/fif"},
            {".fli","video/x-fli"},
            {".flo","image/florian"},
            {".flx","text/vnd.fmi.flexstor"},
            {".fmf","video/x-atomic3d-feature"},
            {".for","text/x-fortran"},
            {".fpx","image/vnd.fpx"},
            {".frl","application/freeloader"},
            {".funk","audio/make"},
            {".g","text/plain"},
            {".g3","image/g3fax"},
            {".gif","image/gif"},
            {".gl","video/x-gl"},
            {".gsd","audio/x-gsm"},
            {".gsm","audio/x-gsm"},
            {".gsp","application/x-gsp"},
            {".gss","application/x-gss"},
            {".gtar","application/x-gtar"},
            {".gz","application/x-compressed"},
            {".gzip","application/x-gzip"},
            {".h","text/x-h"},
            {".hdf","application/x-hdf"},
            {".help","application/x-helpfile"},
            {".hgl","application/vnd.hp-hpgl"},
            {".hh","text/x-h"},
            {".hlb","text/x-script"},
            {".hlp","application/x-helpfile"},
            {".hpg","application/vnd.hp-hpgl"},
            {".hpgl","application/vnd.hp-hpgl"},
            {".hqx","application/binhex"},
            {".hta","application/hta"},
            {".htc","text/x-component"},
            {".htm","text/html"},
            {".html","text/html"},
            {".htmls","text/html"},
            {".htt","text/webviewhtml"},
            {".htx","text/html"},
            {".ice","x-conference/x-cooltalk"},
            {".ico","image/x-icon"},
            {".idc","text/plain"},
            {".ief","image/ief"},
            {".iefs","image/ief"},
            {".iges","model/iges"},
            {".igs","model/iges"},
            {".ima","application/x-ima"},
            {".imap","application/x-httpd-imap"},
            {".inf","application/inf"},
            {".ins","application/x-internett-signup"},
            {".ip","application/x-ip2"},
            {".isu","video/x-isvideo"},
            {".it","audio/it"},
            {".iv","application/x-inventor"},
            {".ivr","i-world/i-vrml"},
            {".ivy","application/x-livescreen"},
            {".jam","audio/x-jam"},
            {".jav","text/x-java-source"},
            {".java","text/x-java-source"},
            {".jcm","application/x-java-commerce"},
            {".jfif","image/jpeg"},
            {".jfif-tbnl","image/jpeg"},
            {".jpe","image/jpeg"},
            {".jpeg","image/jpeg"},
            {".jpg","image/jpeg"},
            {".jps","image/x-jps"},
            {".js","text/javascript"},
            {".jut","image/jutvision"},
            {".kar","audio/midi"},
            {".ksh","text/x-script.ksh"},
            {".la","audio/nspaudio"},
            {".lam","audio/x-liveaudio"},
            {".latex","application/x-latex"},
            {".lha","application/lha"},
            {".lhx","application/octet-stream"},
            {".list","text/plain"},
            {".lma","audio/nspaudio"},
            {".log","text/plain"},
            {".lsp","text/x-script.lisp"},
            {".lst","text/plain"},
            {".lsx","text/x-la-asf"},
            {".ltx","application/x-latex"},
            {".lzh","application/x-lzh"},
            {".lzx","application/x-lzx"},
            {".m","text/x-m"},
            {".m1v","video/mpeg"},
            {".m2a","audio/mpeg"},
            {".m2v","video/mpeg"},
            {".m3u","audio/x-mpequrl"},
            {".man","application/x-troff-man"},
            {".map","application/x-navimap"},
            {".mar","text/plain"},
            {".mbd","application/mbedlet"},
            {".mc$","application/x-magic-cap-package-1.0"},
            {".mcd","application/x-mathcad"},
            {".mcf","text/mcf"},
            {".mcp","application/netmc"},
            {".me","application/x-troff-me"},
            {".mht","message/rfc822"},
            {".mhtml","message/rfc822"},
            {".mid","audio/midi"},
            {".midi","audio/midi"},
            {".mif","application/x-frame"},
            {".mime","message/rfc822"},
            {".mjf","audio/x-vnd.audioexplosion.mjuicemediafile"},
            {".mjpg","video/x-motion-jpeg"},
            {".mm","application/base64"},
            {".mme","application/base64"},
            {".mod","audio/x-mod"},
            {".moov","video/quicktime"},
            {".mov","video/quicktime"},
            {".movie","video/x-sgi-movie"},
            {".mp2","audio/x-mpeg"},
            {".mp3","audio/mpeg3"},
            {".mpa","audio/mpeg"},
            {".mpc","application/x-project"},
            {".mpe","video/mpeg"},
            {".mpeg","video/mpeg"},
            {".mpg","video/mpeg"},
            {".mpga","audio/mpeg"},
            {".mpp","application/vnd.ms-project"},
            {".mpt","application/x-project"},
            {".mpv","application/x-project"},
            {".mpx","application/x-project"},
            {".mrc","application/marc"},
            {".ms","application/x-troff-ms"},
            {".mv","video/x-sgi-movie"},
            {".my","audio/make"},
            {".mzz","application/x-vnd.audioexplosion.mzz"},
            {".nap","image/naplps"},
            {".naplps","image/naplps"},
            {".nc","application/x-netcdf"},
            {".ncm","application/vnd.nokia.configuration-message"},
            {".nif","image/x-niff"},
            {".niff","image/x-niff"},
            {".nix","application/x-mix-transfer"},
            {".nsc","application/x-conference"},
            {".nvd","application/x-navidoc"},
            {".o","application/octet-stream"},
            {".oda","application/oda"},
            {".omc","application/x-omc"},
            {".omcd","application/x-omcdatamaker"},
            {".omcr","application/x-omcregerator"},
            {".p","text/x-pascal"},
            {".p10","application/pkcs10"},
            {".p12","application/pkcs-12"},
            {".p7a","application/x-pkcs7-signature"},
            {".p7c","application/pkcs7-mime"},
            {".p7m","application/pkcs7-mime"},
            {".p7r","application/x-pkcs7-certreqresp"},
            {".p7s","application/pkcs7-signature"},
            {".part","application/pro_eng"},
            {".pas","text/pascal"},
            {".pbm","image/x-portable-bitmap"},
            {".pcl","application/x-pcl"},
            {".pct","image/x-pict"},
            {".pcx","image/x-pcx"},
            {".pdb","chemical/x-pdb"},
            {".pdf","application/pdf"},
            {".pfunk","audio/make"},
            {".pgm","image/x-portable-graymap"},
            {".pic","image/pict"},
            {".pict","image/pict"},
            {".pkg","application/x-newton-compatible-pkg"},
            {".pko","application/vnd.ms-pki.pko"},
            {".pl","text/x-script.perl"},
            {".plx","application/x-pixclscript"},
            {".pm","text/x-script.perl-module"},
            {".pm4","application/x-pagemaker"},
            {".pm5","application/x-pagemaker"},
            {".png","image/png"},
            {".pnm","image/x-portable-anymap"},
            {".pot","application/vnd.ms-powerpoint"},
            {".pov","model/x-pov"},
            {".ppa","application/vnd.ms-powerpoint"},
            {".ppm","image/x-portable-pixmap"},
            {".pps","application/vnd.ms-powerpoint"},
            {".ppt","application/powerpoint"},
            {".pptx","application/powerpoint"},
            {".ppz","application/mspowerpoint"},
            {".pre","application/x-freelance"},
            {".prt","application/pro_eng"},
            {".ps","application/postscript"},
            {".psd","image/x-psd"},
            {".pvu","paleovu/x-pv"},
            {".pwz","application/vnd.ms-powerpoint"},
            {".py","text/x-script.phyton"},
            {".pyc","application/x-bytecode.python"},
            {".qcp","audio/vnd.qcelp"},
            {".qd3","x-world/x-3dmf"},
            {".qd3d","x-world/x-3dmf"},
            {".qif","image/x-quicktime"},
            {".qt","video/quicktime"},
            {".qtc","video/x-qtc"},
            {".qti","image/x-quicktime"},
            {".qtif","image/x-quicktime"},
            {".ra","audio/x-realaudio"},
            {".ram","audio/x-pn-realaudio"},
            {".ras","image/x-cmu-raster"},
            {".rast","image/cmu-raster"},
            {".rexx","text/x-script.rexx"},
            {".rf","image/vnd.rn-realflash"},
            {".rgb","image/x-rgb"},
            {".rm","application/vnd.rn-realmedia"},
            {".rmi","audio/mid"},
            {".rmm","audio/x-pn-realaudio"},
            {".rmp","audio/x-pn-realaudio"},
            {".rng","application/vnd.nokia.ringing-tone"},
            {".rnx","application/vnd.rn-realplayer"},
            {".roff","application/x-troff"},
            {".rp","image/vnd.rn-realpix"},
            {".rpm","audio/x-pn-realaudio-plugin"},
            {".rt","text/richtext"},
            {".rtf","text/richtext"},
            {".rtx","text/richtext"},
            {".rv","video/vnd.rn-realvideo"},
            {".s","text/x-asm"},
            {".s3m","audio/s3m"},
            {".saveme","application/octet-stream"},
            {".sbk","application/x-tbook"},
            {".scm","video/x-scm"},
            {".sdml","text/plain"},
            {".sdp","application/sdp"},
            {".sdr","application/sounder"},
            {".sea","application/x-sea"},
            {".set","application/set"},
            {".sgm","text/x-sgml"},
            {".sgml","text/x-sgml"},
            {".sh","text/x-script.sh"},
            {".shar","application/x-bsh"},
            {".shtml","text/html"},
            {".sid","audio/x-psid"},
            {".sit","application/x-stuffit"},
            {".skd","application/x-koan"},
            {".skm","application/x-koan"},
            {".skp","application/x-koan"},
            {".skt","application/x-koan"},
            {".sl","application/x-seelogo"},
            {".smi","application/smil"},
            {".smil","application/smil"},
            {".snd","audio/x-adpcm"},
            {".sol","application/solids"},
            {".spc","application/x-pkcs7-certificates"},
            {".spl","application/futuresplash"},
            {".spr","application/x-sprite"},
            {".sprite","application/x-sprite"},
            {".src","application/x-wais-source"},
            {".ssi","text/x-server-parsed-html"},
            {".ssm","application/streamingmedia"},
            {".sst","application/vnd.ms-pki.certstore"},
            {".step","application/step"},
            {".stl","application/sla"},
            {".stp","application/step"},
            {".sv4cpio","application/x-sv4cpio"},
            {".sv4crc","application/x-sv4crc"},
            {".svf","image/x-dwg"},
            {".svr","application/x-world"},
            {".swf","application/x-shockwave-flash"},
            {".t","application/x-troff"},
            {".talk","text/x-speech"},
            {".tar","application/x-tar"},
            {".tbk","application/x-tbook"},
            {".tcl","application/x-tcl"},
            {".tcsh","text/x-script.tcsh"},
            {".tex","application/x-tex"},
            {".texi","application/x-texinfo"},
            {".texinfo","application/x-texinfo"},
            {".text","text/plain"},
            {".tgz","application/x-compressed"},
            {".tif","image/tiff"},
            {".tiff","image/tiff"},
            {".tr","application/x-troff"},
            {".tsi","audio/tsp-audio"},
            {".tsp","audio/tsplayer"},
            {".tsv","text/tab-separated-values"},
            {".turbot","image/florian"},
            {".txt","text/plain"},
            {".uil","text/x-uil"},
            {".uni","text/uri-list"},
            {".unis","text/uri-list"},
            {".unv","application/i-deas"},
            {".uri","text/uri-list"},
            {".uris","text/uri-list"},
            {".ustar","application/x-ustar"},
            {".uu","text/x-uuencode"},
            {".uue","text/x-uuencode"},
            {".vcd","application/x-cdlink"},
            {".vcs","text/x-vcalendar"},
            {".vda","application/vda"},
            {".vdo","video/vdo"},
            {".vew","application/groupwise"},
            {".viv","video/vivo"},
            {".vivo","video/vivo"},
            {".vmd","application/vocaltec-media-desc"},
            {".vmf","application/vocaltec-media-file"},
            {".voc","audio/x-voc"},
            {".vos","video/vosaic"},
            {".vox","audio/voxware"},
            {".vqe","audio/x-twinvq-plugin"},
            {".vqf","audio/x-twinvq"},
            {".vql","audio/x-twinvq-plugin"},
            {".vrml","model/vrml"},
            {".vrt","x-world/x-vrt"},
            {".vsd","application/x-visio"},
            {".vst","application/x-visio"},
            {".vsw","application/x-visio"},
            {".w60","application/wordperfect6.0"},
            {".w61","application/wordperfect6.0"},
            {".w6w","application/msword"},
            {".wav","audio/wav"},
            {".wb1","application/x-qpro"},
            {".wbmp","image/vnd.wap.wbmp"},
            {".web","application/vnd.xara"},
            {".wiz","application/msword"},
            {".wk1","application/x-123"},
            {".wmf","windows/metafile"},
            {".wml","text/vnd.wap.wml"},
            {".wmlc","application/vnd.wap.wmlc"},
            {".wmls","text/vnd.wap.wmlscript"},
            {".wmlsc","application/vnd.wap.wmlscriptc"},
            {".word","application/msword"},
            {".wp","application/wordperfect"},
            {".wp5","application/wordperfect"},
            {".wp6","application/wordperfect"},
            {".wpd","application/wordperfect"},
            {".wq1","application/x-lotus"},
            {".wri","application/mswrite"},
            {".wrl","model/vrml"},
            {".wrz","model/vrml"},
            {".wsc","text/scriplet"},
            {".wsrc","application/x-wais-source"},
            {".wtk","application/x-wintalk"},
            {".xbm","image/x-xbitmap"},
            {".xdr","video/x-amt-demorun"},
            {".xgz","xgl/drawing"},
            {".xif","image/vnd.xiff"},
            {".xl","application/excel"},
            {".xla","application/excel"},
            {".xlb","application/excel"},
            {".xlc","application/excel"},
            {".xld","application/excel"},
            {".xlk","application/excel"},
            {".xll","application/excel"},
            {".xlm","application/excel"},
            {".xls","application/excel"},
            {".xlsx","application/excel"},
            {".xlt","application/excel"},
            {".xlv","application/excel"},
            {".xlw","application/excel"},
            {".xm","audio/xm"},
            {".xml","text/xml"},
            {".xmz","xgl/movie"},
            {".xpix","application/x-vnd.ls-xpix"},
            {".xpm","image/x-xpixmap"},
            {".x-png","image/png"},
            {".xsr","video/x-amt-showrun"},
            {".xwd","image/x-xwd"},
            {".xyz","chemical/x-pdb"},
            {".z","application/x-compressed"},
            {".zip","application/x-compressed"},
            {".zoo","application/octet-stream"},
            {".zsh","text/x-script.zsh"}
        };

        public static string GetMineTypeString(string extension)
        {
            string result;
            if (_mineTypesDic.TryGetValue(extension.ToLower(), out result))
            {
                return result;
            }
            else
            {
                return "application/octet-stream";
            }
        }

        public static MineType GetMineType(string filePath)
        {
            string ext = System.IO.Path.GetExtension(filePath);

            string result;
            if (_mineTypesDic.TryGetValue(ext.ToLower(), out result))
            {
                return new MineType(result);
            }
            else
            {
                return new MineType()
                {
                    MajorType = "application",
                    MinorType = "octet-stream"
                };
            }
        }
    }
}
